//
// Created by admin on 2024/7/30.
//
#include "hal-gpio.h"
#include "port_stm32.h"

#include "ArduinoAPI/Arduino.h"

static GPIO_TypeDef *Gpio[] = {
        GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF
};

static uint32_t Pin[] = {
        GPIO_PIN_0, GPIO_PIN_1, GPIO_PIN_2, GPIO_PIN_3,
        GPIO_PIN_4, GPIO_PIN_5, GPIO_PIN_6, GPIO_PIN_7,
        GPIO_PIN_8, GPIO_PIN_9, GPIO_PIN_10, GPIO_PIN_11,
        GPIO_PIN_12, GPIO_PIN_13, GPIO_PIN_14, GPIO_PIN_15
};

void pinMode(uint32_t pin, uint32_t mode) {
    pinModePull(pin, mode, GPIO_NOPULL);
}

void pinModePull(uint32_t pin, uint32_t mode, uint32_t pull) {
    GPIO_InitTypeDef init = {0};

    GPIO_TypeDef *gpio = Gpio[pin / 16];
    uint32_t     io    = Pin[pin % 16];

    HAL_GPIO_WritePin(gpio, io, GPIO_PIN_RESET);

    /*Configure GPIO pin : led_wired_Pin */
    init.Pin   = io;
    init.Mode  = mode;
    init.Pull  = pull;
    init.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(gpio, &init);
}

void digitalWrite(uint32_t pin, uint8_t val) {
    GPIO_TypeDef *gpio = Gpio[pin / 16];
    uint32_t     io    = Pin[pin % 16];

    HAL_GPIO_WritePin(gpio, io,
                      val ? GPIO_PIN_SET : GPIO_PIN_RESET);
}

int digitalRead(uint32_t pin) {
    GPIO_TypeDef *gpio = Gpio[pin / 16];
    uint32_t     io    = Pin[pin % 16];

    uint8_t val = HAL_GPIO_ReadPin(gpio, io);

    return (val ? 1 : 0);
}

void digitalToggle(uint32_t pin) {
    int val = digitalRead(pin);
    digitalWrite(pin, !val);
}